#include "com/get_com_message.hpp"
#include "mavlink/mavlink_helpers.h"
#include <qstringview.h>

GetComMessage::GetComMessage(QObject *parent, QSerialPort *serial)
    : QObject(parent) {
  this->serial = serial;
  this->mavlink_chan = MAVLINK_COMM_0;
}

/**
 * @brief 处理从COM口读取的字节流并解析MAVLink消息
 */
void GetComMessage::parseMavlinkMessage() {
  // 读取串口接收缓冲区中的所有字节
  while (this->serial->bytesAvailable() > 0) {
    uint8_t byte;
    // 读取一个字节
    qint64 bytes_read = this->serial->read((char *)&byte, 1);
    if (bytes_read != 1) {
      continue; // 读取失败则跳过
    }
    // 解析字节流（文档中核心函数mavlink_parse_char的应用）
    if (mavlink_parse_char(mavlink_chan, byte, &this->mavlink_msg, &this->mavlink_status)) {
      // 解析成功，处理完整消息
      switch (this->mavlink_msg.msgid) {
        case MAVLINK_MSG_ID_GLOBAL_POSITION_INT: {
          mavlink_global_position_int_t pos;
          mavlink_msg_global_position_int_decode(&this->mavlink_msg, &pos);
          printf("位置信息 - 纬度: %d, 经度: %d, 高度: %d\n", pos.lat, pos.lon, pos.alt);
          
          // 发射GPS消息接收信号
          emit gpsMessageReceived(this->mavlink_msg);
          break;
        }
        case MAVLINK_MSG_ID_GPS_STATUS: {
          uint8_t visible_sats =
              mavlink_msg_gps_status_get_satellites_visible(&this->mavlink_msg);
          printf("GPS状态 - 可见卫星数: %d\n", visible_sats);
          break;
        }
        // 可添加其他消息ID的解析
        default: break;
      }
    }
  }
}

QList<int> GetComMessage::putMavlinkMessage() {
  this->parseMavlinkMessage();
  QList<int> messageList;
  messageList.append(this->mavlink_msg.msgid);
  messageList.append(this->mavlink_msg.sysid);
  messageList.append(this->mavlink_msg.compid);
  return messageList;
}

mavlink_message_t GetComMessage::getMavlinkMessage() {
  return this->mavlink_msg;
}